/* * Scriptographer * * This file is part of Scriptographer, a Scripting Plugin for Adobe Illustrator * http://scriptographer.org/ * * Copyright (c) 2002-2010, Juerg Lehni * http://scratchdisk.com/ * * All rights reserved. See LICENSE file for details. * * File created on Feb 12, 2008. */ package com.scriptographer.script; import java.lang.reflect.Field; import com.scratchdisk.script.ArgumentConverter; import com.scratchdisk.script.ArgumentReader; import com.scriptographer.ai.CMYKColor; import com.scriptographer.ai.Color; import com.scriptographer.ai.GrayColor; import com.scriptographer.ai.RGBColor; /** * @author lehni * */ public class ColorConverter extends ArgumentConverter<Color> { public Color convert(ArgumentReader reader, Object from) { // TODO: gradient & pattern color // Since StringArgumentReaders also return true for isArray (they // can behave like arrays as well), always check for isString first! if (reader.isString()) { String name = reader.readString(); if ("".equals(name)) return Color.NONE; try { // Try hex string first String str = name.startsWith("#") ? name : "#" + name; return new RGBColor(java.awt.Color.decode(str)); } catch (Exception e1) { try { // If that does not work, try accessing the static Color.NAME field Field field = java.awt.Color.class.getField(name.toUpperCase()); return new RGBColor((java.awt.Color) field.get(java.awt.Color.class)); } catch (Exception e2) { } } } else if (reader.isArray()) { int size = reader.size(); if (size == 4) { // CMYK return new CMYKColor( reader.readFloat(0), reader.readFloat(0), reader.readFloat(0), reader.readFloat(0) ); } else if (size == 3) { // RGB return new RGBColor( reader.readFloat(0), reader.readFloat(0), reader.readFloat(0) ); } else if (size == 1) { // Gray return new GrayColor( reader.readFloat(0) ); } } else if (reader.isMap()) { if (reader.has("red")) { return new RGBColor( reader.readFloat("red", 0), reader.readFloat("green", 0), reader.readFloat("blue", 0), reader.readFloat("alpha", 1) ); } else if (reader.has("cyan")) { return new CMYKColor( reader.readFloat("cyan", 0), reader.readFloat("magenta", 0), reader.readFloat("yellow", 0), reader.readFloat("black", 0), reader.readFloat("alpha", 1) ); } else if (reader.has("gray")) { return new GrayColor( reader.readFloat("gray", 0), reader.readFloat("alpha", 1) ); } } return null; } }